package com.lyrcsoft.rxjava1x.operators.convert;

/**
 * @author fujc2dev@126.com
 * @date 2024-11-19
 */

import rx.Observable;
import rx.schedulers.Schedulers;

import java.util.concurrent.TimeUnit;

import rx.Observable;
import rx.schedulers.Schedulers;

public class RxJavaFlatMapConcatMapExample {

    /**
     * <b><u>关键点总结</u></b>
     * <p>
     * <b>并发处理：</b>
     * <p>
     * flatMap 支持并发发射多个子Observable的数据。
     * concatMap 保持顺序处理，不会同时发射多个子Observable的数据。
     * <p>
     * <b>适用场景：</b>
     * <p>
     * 如果不关心顺序、想要提高性能：用 flatMap。如果必须保证顺序：用 concatMap。
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Using flatMap:");
        Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9)
                .flatMap(i -> Observable.just(i)
                        .subscribeOn(Schedulers.io()) // 模拟异步操作
                        .map(val -> "flatMap -> " + val))
                .subscribe(System.out::println);

        Thread.sleep(1000); // 等待异步完成

        System.out.println("\nUsing concatMap:");
        Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9)
                .concatMap(i -> Observable.just(i)
                        .subscribeOn(Schedulers.io()) // 模拟异步操作
                        .map(val -> "concatMap -> " + val))
                .subscribe(System.out::println);

        Thread.sleep(1000); // 等待异步完成
    }
}


/**
 * 在RxJava1中，flatMap 和 concatMap 的主要区别在于它们处理发射顺序的方式：
 * flatMap：不保证子Observable发射的数据的顺序。它将多个子Observable的发射物合并在一起。
 * concatMap：严格按照顺序发射子Observable中的数据。它会等待前一个子Observable完成后才处理下一个。
 */

